package com.examination.exam.utils;

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import java.util.List;


@Component
@Data
public class MongoDbUtil<T> {

    @Autowired
    private MongoTemplate mongoTemplate;


    /***
     * 保存一个集合(对象)(如果数据库中的id和要保存的id一样，那么会被覆盖)
     */
    public T save(T t, String collectionName) {
        createCollection(collectionName);
        return this.mongoTemplate.save(t, collectionName);
    }

    /***
     * 根据id从集合中查询对象
     */
    public T queryById(Object id, Class<T> clazz, String collectionName) {
        createCollection(collectionName);
        Query query = new Query(Criteria.where("_id").is(id));
        return this.mongoTemplate.findOne(query, clazz, collectionName);
    }

    /**
     * 根据id删除
     */
    public int deleteById(Long id, Class<T> clazz, String collectionName) {
        createCollection(collectionName);
        Criteria criteria = Criteria.where("_id").is(id);
        Query query = new Query(criteria);
        T obj = this.mongoTemplate.findOne(query, clazz, collectionName);
        if (obj != null) {
            return (int) this.mongoTemplate.remove(obj, collectionName).getDeletedCount();
        }
        return 0;
    }

    /**
     * 功能描述: 往对应的集合中插入一条数据
     */
    public void insert(T info, String collectionName) {
        createCollection(collectionName);
        mongoTemplate.insert(info, collectionName);
    }

    /**
     * 功能描述: 往对应的集合中批量插入数据，注意批量的数据中不要包含重复的id
     */
    public void insertMulti(List<T> infos, String collectionName) {
        createCollection(collectionName);
        mongoTemplate.insert(infos, collectionName);
    }


    /**
     * 功能描述: 根据id删除集合中的内容
     */
    public void deleteValueById(String id, Class<T> clazz, String collectionName) {
        createCollection(collectionName);
        // 设置查询条件，当id=#{id}
        Query query = new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, clazz, collectionName);
    }

    /**
     * 功能描述: 查询列表信息
     */
    public List<T> selectList(String collectName, Class<T> clazz) {
        createCollection(collectName);
        return selectList(collectName, clazz, null, null);
    }

    /**
     * 功能描述: 创建一个集合
     * 同一个集合中可以存入多个不同类型的对象，我们为了方便维护和提升性能，
     * 后续将限制一个集合中存入的对象类型，即一个集合只能存放一个类型的数据
     *
     * @param name 集合名称，相当于传统数据库的表名
     */
    public void createCollection(String name) {
        if (!mongoTemplate.collectionExists(name)) {
            mongoTemplate.createCollection(name);
        }
    }

    /**
     * 功能描述: 分页查询列表信息
     */
    public List<T> selectList(String collectName, Class<T> clazz, Integer currentPage, Integer pageSize) {
        createCollection(collectName);
        //设置分页参数
        Query query = new Query();
        //设置分页信息
        if (!ObjectUtils.isEmpty(currentPage) && ObjectUtils.isEmpty(pageSize)) {
            query.limit(pageSize);
            query.skip(pageSize * (currentPage - 1));
        }
        return mongoTemplate.find(query, clazz, collectName);
    }
}